package com.ruoyi.checksystem.domain;

import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;

/**
 * VIP套餐对象 vip_package
 *
 * @author ruoyi
 * @date 2025-03-19
 */
public class VipPackage extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /**
     * 主键ID
     */
    private Long id;

    /**
     * 关联用户ID
     */
    @Excel(name = "关联用户ID")
    private Long userId;

    /**
     * 套餐类型，例如：普通会员、VIP1、VIP2
     */
    @Excel(name = "套餐类型，例如：普通会员、VIP1、VIP2")
    private String packageType;

    /**
     * 总额度（点数）
     */
    @Excel(name = "总额度", readConverterExp = "点=数")
    private Integer totalQuota;

    /**
     * 已使用额度（点数）
     */
    @Excel(name = "已使用额度", readConverterExp = "点=数")
    private Integer usedQuota;

    /**
     * 开通日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "开通日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date startTime;

    /**
     * 到期日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "到期日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;

    /**
     * 删除标记（1已删除，0未删除）
     */
    @Excel(name = "删除标记", readConverterExp = "1=已删除,0=未删除")
    private Object isDeleted;

    /**
     * 延期天数 - 用于充值计算
     */
    private Integer extensionDays;

    /**
     * 操作类型 - 用于区分操作，例如"query"仅查询不充值
     */
    private String operationType;

    /**
     * 是否基于现有到期时间延期
     * true表示基于现有到期时间延期，false表示基于当前时间重新计算
     */
    private Boolean extendFromExisting;

    /**
     * 单次充值积分点数 - 用于记录单次充值的积分，不累加到总积分中
     */
    private Integer singleRechargePoints;

    /**
     * 套餐价格 - 用于创建充值记录
     */
    private Integer packagePrice;

    /**
     * 是否创建充值记录
     */
    private Boolean recordPayment;

    /**
     * 充值记录数据 - 存储前端传递的充值记录详情
     */
    private Object recordDetails;

    /**
     * 是否重置积分 - true表示重置积分而不是累加
     */
    private Boolean resetPoints;

    /**
     * 获取主键ID
     * @return 主键ID
     */
    public Long getId() {
        return id;
    }

    /**
     * 设置主键ID
     * @param id 主键ID
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * 获取关联用户ID
     * @return 关联用户ID
     */
    public Long getUserId() {
        return userId;
    }

    /**
     * 设置关联用户ID
     * @param userId 关联用户ID
     */
    public void setUserId(Long userId) {
        this.userId = userId;
    }

    /**
     * 获取套餐类型
     * @return 套餐类型
     */
    public String getPackageType() {
        return packageType;
    }

    /**
     * 设置套餐类型
     * @param packageType 套餐类型
     */
    public void setPackageType(String packageType) {
        this.packageType = packageType;
    }

    /**
     * 获取总额度
     * @return 总额度
     */
    public Integer getTotalQuota() {
        return totalQuota;
    }

    /**
     * 设置总额度
     * @param totalQuota 总额度
     */
    public void setTotalQuota(Integer totalQuota) {
        this.totalQuota = totalQuota;
    }

    /**
     * 获取已使用额度
     * @return 已使用额度
     */
    public Integer getUsedQuota() {
        return usedQuota;
    }

    /**
     * 设置已使用额度
     * @param usedQuota 已使用额度
     */
    public void setUsedQuota(Integer usedQuota) {
        this.usedQuota = usedQuota;
    }

    /**
     * 获取开通日期
     * @return 开通日期
     */
    public Date getStartTime() {
        return startTime;
    }

    /**
     * 设置开通日期
     * @param startTime 开通日期
     */
    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }

    /**
     * 获取到期日期
     * @return 到期日期
     */
    public Date getEndTime() {
        return endTime;
    }

    /**
     * 设置到期日期
     * @param endTime 到期日期
     */
    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }

    /**
     * 获取删除标记
     * @return 删除标记（1已删除，0未删除）
     */
    public Integer getIsDeleted() {
        // 如果isDeleted是字符串类型的"Y"或"N"，则转换为整数
        if (isDeleted != null) {
            if (isDeleted instanceof String) {
                String strValue = (String) isDeleted;
                return "Y".equalsIgnoreCase(strValue) ? 1 : 0;
            } else if (isDeleted instanceof Integer) {
                return (Integer) isDeleted;
            } else {
                // 其他情况，尝试转换为整数
                try {
                    return Integer.parseInt(isDeleted.toString());
                } catch (Exception e) {
                    // 如果转换失败，则默认为0（未删除）
                    return 0;
                }
            }
        }
        return 0; // 默认未删除
    }

    /**
     * 设置删除标记
     * @param isDeleted 删除标记（1或"Y"表示已删除，0或"N"表示未删除）
     */
    public void setIsDeleted(Object isDeleted) {
        this.isDeleted = isDeleted;
    }

    /**
     * 获取延期天数
     * @return 延期天数
     */
    public Integer getExtensionDays() {
        return extensionDays;
    }

    /**
     * 设置延期天数
     * @param extensionDays 延期天数
     */
    public void setExtensionDays(Integer extensionDays) {
        this.extensionDays = extensionDays;
    }

    /**
     * 获取操作类型
     * @return 操作类型
     */
    public String getOperationType() {
        return operationType;
    }

    /**
     * 设置操作类型
     * @param operationType 操作类型
     */
    public void setOperationType(String operationType) {
        this.operationType = operationType;
    }

    /**
     * 获取是否基于现有到期时间延期
     * @return 是否基于现有到期时间延期
     */
    public Boolean getExtendFromExisting() {
        return extendFromExisting;
    }

    /**
     * 设置是否基于现有到期时间延期
     * @param extendFromExisting 是否基于现有到期时间延期
     */
    public void setExtendFromExisting(Boolean extendFromExisting) {
        this.extendFromExisting = extendFromExisting;
    }

    /**
     * 获取单次充值积分点数
     * @return 单次充值积分点数
     */
    public Integer getSingleRechargePoints() {
        return singleRechargePoints;
    }

    /**
     * 设置单次充值积分点数
     * @param singleRechargePoints 单次充值积分点数
     */
    public void setSingleRechargePoints(Integer singleRechargePoints) {
        this.singleRechargePoints = singleRechargePoints;
    }

    /**
     * 获取是否记录支付
     * @return 是否记录支付
     */
    public Boolean getRecordPayment() {
        return recordPayment;
    }

    /**
     * 设置是否记录支付
     * @param recordPayment 是否记录支付
     */
    public void setRecordPayment(Boolean recordPayment) {
        this.recordPayment = recordPayment;
    }

    /**
     * 获取套餐价格
     * @return 套餐价格
     */
    public Integer getPackagePrice() {
        return packagePrice;
    }

    /**
     * 设置套餐价格
     * @param packagePrice 套餐价格
     */
    public void setPackagePrice(Integer packagePrice) {
        this.packagePrice = packagePrice;
    }

    /**
     * 获取充值记录数据
     * @return 充值记录数据
     */
    public Object getRecordDetails() {
        return recordDetails;
    }

    /**
     * 设置充值记录数据
     * @param recordDetails 充值记录数据
     */
    public void setRecordDetails(Object recordDetails) {
        this.recordDetails = recordDetails;
    }

    /**
     * 获取是否重置积分
     * @return 是否重置积分
     */
    public Boolean getResetPoints() {
        return resetPoints;
    }

    /**
     * 设置是否重置积分
     * @param resetPoints 是否重置积分
     */
    public void setResetPoints(Boolean resetPoints) {
        this.resetPoints = resetPoints;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
                .append("id", getId())
                .append("userId", getUserId())
                .append("packageType", getPackageType())
                .append("totalQuota", getTotalQuota())
                .append("usedQuota", getUsedQuota())
                .append("startTime", getStartTime())
                .append("endTime", getEndTime())
                .append("createTime", getCreateTime())
                .append("updateTime", getUpdateTime())
                .append("isDeleted", getIsDeleted())
                .append("extensionDays", getExtensionDays())
                .append("extendFromExisting", getExtendFromExisting())
                .append("operationType", getOperationType())
                .append("recordPayment", getRecordPayment())
                .append("packagePrice", getPackagePrice())
                .append("singleRechargePoints", getSingleRechargePoints())
                .append("resetPoints", getResetPoints())
                .append("recordDetails", getRecordDetails())
                .toString();
    }

    /**
     * 检查套餐是否已过期
     * @return 如果已过期返回true，否则返回false
     */
    public boolean isExpired() {
        Date now = new Date();
        return endTime != null && endTime.before(now);
    }

    /**
     * 检查套餐是否还有可用额度
     * @return 如果还有可用额度返回true，否则返回false
     */
    public boolean hasAvailableQuota() {
        return totalQuota != null && usedQuota != null && totalQuota > usedQuota;
    }
}